import myAxios from 'axios'
import {ElMessage} from "element-plus";
import {refreshTokenAPI} from "../api/user/user.js";

const urlDev = 'http://127.0.0.1:8123/api';

const instance = myAxios.create({
    baseURL: urlDev,
    timeout: 15000,
});

// // //设置cross跨域 并设置访问权限 允许跨域携带cookie信息
// instance.defaults.withCredentials = true;


// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 从 localStorage 获取 accessToken
    const accessToken = localStorage.getItem('accessToken');//获取accessToken
    const uuid = localStorage.getItem('uuid');//获取uuid 后续刷新请求token时携带
    // 如果 accessToken 存在，添加到请求头
    if (accessToken) {
        config.headers['Authorization'] = 'Bearer ' + accessToken;
        //todo 携带uuid

    }
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    console.log('全局响应拦截器：',response.data);
    console.log('全局响应拦截器code：',response.data.code);
    // 处理 token 失效或需要重新登录的状态码
    if (response.data.code === 208){//token失效或者 未登录
        ElMessage.error(response.data.message || '登录状态失效，请重新登录');
        // 清除本地存储的 token
        localStorage.removeItem('accessToken');
        // 跳转到登录页面
        // 注意：在非 Vue 组件中直接使用 router 实例比较复杂，这里使用 window.location.href 进行硬跳转
        window.location.href = '/login';
        // 阻止后续的 Promise 链继续执行
        return Promise.reject('Token失效');
    }
    if (response.data.code === 202){//登录成功，进行缓存token
        localStorage.setItem('accessToken', response.data.data?.accessToken);
        localStorage.setItem('uuid', response.data.data?.uuid)
        return response.data;
    }
    if (response.data.code === 200){ //数据请求成功
        return response.data; //直接返回数据
    }
    if (response.data.code !== 200 && response.data.code !== 202){
        // 弹出错误提示
        console.log('response.data.message' ,response.data?.data.message)
        ElMessage.error(response.data.data.message || response.data.message || '请求失败，请稍后重试');
    }
    return response.data;
}, async function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // 可以在这里处理网络错误等
    // ElMessage.error('请求失败，请检查网络或稍后重试');
    const originalRequest = error.config;//请求的原始配置信息
    const response = error.response;//服务器返回的响应信息
    //处理token失效
    if (response && response.status === 401) {
        // token失效，清除本地存储的 token
        localStorage.removeItem('accessToken');
        const uuid = localStorage.getItem('uuid');
        if (!uuid){
            window.location.href = '/login';//跳转到登录页面
        }
        // 重新请求token
        const res = await refreshTokenAPI(uuid);
        if (res.code === 200){//登录成功，重新缓存token
            localStorage.setItem('accessToken', res.data?.accessToken);
            localStorage.setItem('uuid', res.data?.uuid)
            // 重新请求之前的请求
            return instance(originalRequest);
        }
         // 弹出错误提示
        ElMessage.error(res.data.message || '登录状态失效，请重新登录');
        // 阻止后续的 Promise 链继续执行
        return Promise.reject('Token失效');
    }
    return Promise.reject(error);
});
// 导出axios实例
export default instance;